home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / xmmlrg.exe / CMACROS.INC < prev    next >
Text File  |  1989-03-21  |  17KB  |  1,235 lines

  1. comment $
  2. cmacros - assembly macros for interfacing to hhls
  3. (C)Copyright Microsoft Corp. 1984-1987
  4. $
  5. .xcref
  6. .xcref ??_out
  7. ??_out macro t
  8. ifndef ?QUIET
  9. %out t
  10. endif
  11. endm
  12. outif macro name,defval,onmsg,offmsg
  13. ifndef name
  14. ifb <defval>
  15. name=0
  16. else
  17. name=defval
  18. endif
  19. endif
  20. if name
  21. name=1
  22. ifnb <onmsg>
  23. ??_out <! onmsg>
  24. endif
  25. else
  26. ifnb <offmsg>
  27. ??_out <! offmsg>
  28. endif
  29. endif
  30. endm
  31. .xcref ??error
  32. ??error macro msg
  33. e r r o r ----- msg
  34. .err
  35. endm
  36. .xcref ASMpass
  37. .xcref memS,memM,memL,memC,memH,memMOD,sizec,sized
  38. if1
  39. ASMpass=1
  40. ifdef ?SMALL
  41. memS=1
  42. endif
  43. ifdef ?MEDIUM
  44. memM=1
  45. endif
  46. ifdef ?COMPACT
  47. memC=1
  48. endif
  49. ifdef ?LARGE
  50. memL=1
  51. endif
  52. ifdef ?HUGE
  53. memH=1
  54. endif
  55. ??_out <cMacros Version 5.00 - 01/26/88>
  56. ??_out <Copyright (C) Microsoft Corp. 1984-1988. All rights reserved.>
  57. outif memS,0,<Small Model>
  58. outif memM,0,<Medium model>
  59. outif memL,0,<Large Model>
  60. outif memC,0,<Compact Model>
  61. outif memH,0,<Huge Model>
  62. memMOD= memS + memM + memL + memC + memH
  63. if memMOD ne 1
  64. if memMOD eq 0
  65. memS = 1
  66. outif memS,0,<Small model>
  67. else
  68. ??error <must have only 1 memory model selected>
  69. endif
  70. endif
  71. sizec= memM + memL + memH
  72. sized= memL + memC + (memH*2)
  73. outif ?DF,0,<No segments or groups will be defined>
  74. outif ?TF,0,<Epilog sequences assume valid SP>
  75. outif ?WIN,1,<Windows support>
  76. outif ?PLM,1,<PL/M calling convention>
  77. ifndef ?NODATA
  78. ?nodata1=0
  79. else
  80. ?nodata1=1
  81. ??_out <! NODATA module>
  82. endif
  83. ifndef ?CHKSTK
  84. ?chkstk1=0
  85. else
  86. ?chkstk1=1
  87. ifdef ?CHKSTKPROC
  88. ??_out <! Private stack checking enabled>
  89. else
  90. ??_out <! Stack checking enabled>
  91. endif
  92. endif
  93. ifndef DOS5
  94. ?DOS5=0
  95. else
  96. ?DOS5=1
  97. ??_out <! DOS5 module>
  98. endif
  99. ifdef ?PROFILE
  100. ??_out <! Native profiling enabled>
  101. endif
  102. else
  103. ASMpass=2
  104. endif
  105. .xcref ?n,?ax,?ah,?al,?bx,?bh
  106. .xcref ?bl,?cx,?ch,?cl,?dx,?dh
  107. .xcref ?dl,?si,?di,?es,?ds,?bp
  108. .xcref ?sp,?ss,?cs
  109. .xcref ?rsl,?cpd,?argl,?argc,?ba
  110. .xcref ?acb,???,?po
  111. .xcref ?pas,?pc
  112. .xcref uconcat,mpush,mpop
  113. .xcref ?ri,?pp,?pp1,?al1
  114. .xcref ?ad,?ap,?atal,?dd,?dd1,?dd2
  115. .xcref ?pg,?pg1,?aloc,?cs1,?cs2
  116. .xcref ?DF,?TF,?ff,?PLM,?WIN,?ia,?pu,?adj
  117. .xcref ?uf,?rp,?nx,?nd,?nodata1,?chkstk1,?DOS5
  118. .xcref ?wfp,arg,cCall,cProc,assumes,?cs3,?cs2,?cs1
  119. .xcref defgrp,addseg,createSeg
  120. .xcref save,outif,errnz,errn$,errnz1
  121. .xcref ?PLMPrevParm,?gcc
  122. .xcref ?cCall1,?pcc
  123. ?rsl = 0
  124. ?cpd = 0
  125. ?argl = 0
  126. ?argc = 0
  127. ?ba = 0
  128. ?acb = 0
  129. ??? = 0
  130. ?po = 0
  131. ?pas = 0
  132. ?pc = 0
  133. ?ia = 0
  134. ?pu = 0
  135. ?adj = 0
  136. ?rp = 0
  137. ?uf = 0
  138. ?nd = 0
  139. ?nx = 0
  140. ?wfp = 0
  141. ?ff = 0
  142. ?dd2 = 0
  143. ?cCall1 = 0
  144. ?pcc = 0
  145. ?PLMPrevParm = 0
  146. .xcref ?casen
  147. if1
  148. ?casen = 0
  149. endif
  150. ?n = 0000000000000000b
  151. ?ax = 0000000000000011b
  152. ?ah = 0000000000000001b
  153. ?al = 0000000000000010b
  154. ?bx = 0000000000001100b
  155. ?bh = 0000000000000100b
  156. ?bl = 0000000000001000b
  157. ?cx = 0000000000110000b
  158. ?ch = 0000000000010000b
  159. ?cl = 0000000000100000b
  160. ?dx = 0000000011000000b
  161. ?dh = 0000000001000000b
  162. ?dl = 0000000010000000b
  163. ?si = 0000000100000000b
  164. ?di = 0000001000000000b
  165. ?es = 0000010000000000b
  166. ?ds = 0000100000000000b
  167. ?bp = 0001000000000000b
  168. ?sp = 0010000000000000b
  169. ?ss = 0100000000000000b
  170. ?cs = 1000000000000000b
  171. .cref
  172. uconcat macro a,b,c,d,e,f,g
  173. a&b c&d e&f&g
  174. endm
  175. mpush macro r
  176. irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
  177. if (r and ?&&x)
  178.     push    x
  179. endif
  180. endm
  181. endm
  182. mpop macro r
  183. irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
  184. if (r and ?&&x)
  185.     pop    x
  186. endif
  187. endm
  188. endm
  189. save macro r
  190. ?rsl=0
  191. ?ri ?rsl,<r>
  192. endm
  193. ?ri macro n,r
  194. irp x,<r>
  195. ifdef ?&&x
  196. n=n or ?&&x
  197. endif
  198. endm
  199. endm
  200. .xcref
  201. .xcref parmB,parmW,parmD,parmQ,parmT,parmCP,parmDP
  202. .cref
  203. parmB macro n
  204. ?pp <n>,<byte>,2,1
  205. endm
  206. parmW macro n
  207. ?pp <n>,<word>,2,2
  208. endm
  209. parmD macro n
  210. ife ?PLM
  211. irp x,<n>
  212. ?pp <&&x>,<dword>,0,4
  213. ?pp <off_&&x>,<word>,2,2
  214. ?pp <seg_&&x>,<word>,2,2
  215. endm
  216. else
  217. irp x,<n>
  218. ?pp <seg_&&x>,<word>,2,2
  219. ?pp <off_&&x>,<word>,2,2
  220. ?pp <&&x>,<dword>,0,4
  221. endm
  222. endif
  223. endm
  224. parmQ macro n
  225. ?pp <n>,<qword>,8,8
  226. endm
  227. parmT macro n
  228. ?pp <n>,<tbyte>,10,10
  229. endm
  230. if sizec
  231. parmCP macro n
  232. parmD <n>
  233. endm
  234. else
  235. parmCP macro n
  236. parmW <n>
  237. endm
  238. endif
  239. if sized
  240. parmDP macro n
  241. parmD <n>
  242. endm
  243. else
  244. parmDP macro n
  245. parmW <n>
  246. endm
  247. endif
  248. ?pp macro n,t,l,s
  249. if ?cpd
  250. .xcref
  251. irp x,<n>
  252. .xcref ?t&&x
  253. ?t&&x=s
  254. ife ?PLM
  255. ?pp1 x,<t>,,,%(?po+?adj)
  256. ?po=?po+l
  257. else
  258. ?PLMPrevParm=?PLMPrevParm+1
  259. ?po=?po+l
  260. ?pp1 x,<t>,%?po,%?adj,,%?PLMPrevParm,%(?PLMPrevParm-1)
  261. endif
  262. endm
  263. .cref
  264. else
  265. ??error <parm(s) "&n" declared outside proc def>
  266. endif
  267. endm
  268. ?pp1 macro n,t,o,a,b,cpc,ppc
  269. ife ?PLM
  270. n equ (t ptr [bp+b])
  271. else
  272. .xcref
  273. .xcref ?PLMParm&cpc
  274. .cref
  275. ?PLMParm&cpc ¯o po
  276. uconcat <n>,,<equ>,,<(t ptr [bp+>,%(a+po-o),<])>
  277. ?PLMParm&ppc po
  278. purge ?PLMParm&cpc
  279. &endm
  280. endif
  281. endm
  282. ifndef ?NOPARMR
  283. .xcref
  284. .xcref ?pr,parmR
  285. .cref
  286. parmR macro n,r,r2
  287. ?pr n,r,r2,%?rp,%(?ia+2)
  288. endm
  289. ?pr macro n,r,r2,i,o
  290. .xcref
  291. ifnb <r2>
  292. parmR seg_&n,r
  293. parmR off_&n,r2
  294. n equ (dword ptr [bp-o-2])
  295. .xcref ?t&n
  296. ?t&n=4
  297. else
  298. .xcref ?rp&i
  299. ?rp&i=0
  300. ifdef ?&r
  301. ?rp&i=?&r
  302. endif
  303. if ??? or (?cpd eq 0) or (?rp&i eq 0)
  304. ??error <invalid parmR encountered: &n,&r>
  305. exitm
  306. endif
  307. n equ (word ptr [bp-o])
  308. ?t&n=2
  309. irp x,<bh,ch,dh,bl,cl,dl,ah,al>
  310. if ?&&x eq ?&r
  311. n equ (byte ptr [bp-o])
  312. ?t&n=1
  313. exitm
  314. endif
  315. endm
  316. ?ia=?ia+2
  317. ?rp=?rp+1
  318. endif
  319. .cref
  320. endm
  321. endif
  322. .xcref
  323. .xcref localB,localW,localD,localQ,localT,localCP,localDP,localV
  324. .cref
  325. localB macro n
  326. ?aloc <n>,<byte ptr>,1,1,0
  327. endm
  328. localW macro n
  329. ?aloc <n>,<word ptr>,2,2,1
  330. endm
  331. localD macro n
  332. irp x,<n>
  333. ?aloc <seg_&&x>,<word ptr>,2,2,1
  334. ?aloc <off_&&x>,<word ptr>,2,2,1
  335. ?aloc <&&x>,<dword ptr>,0,4,1
  336. endm
  337. endm
  338. localQ macro n
  339. ?aloc <n>,<qword ptr>,8,8,1
  340. endm
  341. localT macro n
  342. ?aloc <n>,<tbyte ptr>,10,10,1
  343. endm
  344. if sizec
  345. localCP macro n
  346. localD <n>
  347. endm
  348. else
  349. localCP macro n
  350. localW <n>
  351. endm
  352. endif
  353. if sized
  354. localDP macro n
  355. localD <n>
  356. endm
  357. else
  358. localDP macro n
  359. localW <n>
  360. endm
  361. endif
  362. localV macro n,a
  363. ?aloc <n>,,%(a),0,1
  364. endm
  365. ?aloc macro n,t,l,s,a
  366. if ?cpd
  367. .xcref
  368. irp x,<n>
  369. ???=???+l
  370. if a
  371. ???=((??? + 1) and 0fffeh)
  372. endif
  373. ?al1 x,<t>,%(???+?ia)
  374. .xcref ?t&&x
  375. ?t&&x=s
  376. endm
  377. .cref
  378. else
  379. ??error <locals "&n" declared outside procedure def>
  380. endif
  381. endm
  382. ?al1 macro n,t,o
  383. n equ (t [bp-o])
  384. endm
  385. ?gcc macro s,i,cc
  386. s = i
  387. ifnb <cc>
  388. ifidn <cc>,<C>
  389. s=0
  390. endif
  391. ifidn <cc>,<PLM>
  392. s=1
  393. endif
  394. ifidn <cc>,<PASCAL>
  395. s=1
  396. endif
  397. endif
  398. endm
  399. ifndef ?NOGLOBAL
  400. .xcref
  401. .xcref globalB,globalW,globalD,globalQ,globalT,globalCP,globalDP
  402. .cref
  403. globalB macro n,i,s,c
  404. ?ad <n>,1
  405. ?dd n,1,<byte>,<db>,<i>,<s>,<c>
  406. endm
  407. globalW macro n,i,s,c
  408. ?ad <n>,2
  409. ?dd n,1,<word>,<dw>,<i>,<s>,<c>
  410. endm
  411. globalD macro n,i,s,c
  412. ?ad <n>,4
  413. ?dd n,1,<dword>,<dd>,<i>,<s>,<c>
  414. off_&n equ n
  415. seg_&n equ n[2]
  416. endm
  417. globalQ macro n,i,s,c
  418. ?ad <n>,8
  419. ?dd n,1,<qword>,<dq>,<i>,<s>,<c>
  420. endm
  421. globalT macro n,i,s,c
  422. ?ad <n>,10
  423. ?dd n,1,<tbyte>,<dt>,<i>,<s>,<c>
  424. endm
  425. if sizec
  426. globalCP macro n,i,s,c
  427. globalD n,<i>,<s>,<c>
  428. endm
  429. else
  430. globalCP macro n,i,s,c
  431. globalW n,<i>,<s>,<c>
  432. endm
  433. endif
  434. if sized
  435. globalDP macro n,i,s,c
  436. globalD n,<i>,<s>,<c>
  437. endm
  438. else
  439. globalDP macro n,i,s,c
  440. globalW n,<i>,<s>,<c>
  441. endm
  442. endif
  443. endif
  444. ifndef ?NOSTATIC
  445. .xcref
  446. .xcref staticB,staticW,staticD,staticQ,staticT,staticCP,staticDP
  447. .cref
  448. staticB macro n,i,s
  449. ?ad <n>,1
  450. ?dd n,0,<byte>,<db>,<i>,<s>,<PLM>
  451. endm
  452. staticW macro n,i,s
  453. ?ad <n>,2
  454. ?dd n,0,<word>,<dw>,<i>,<s>,<PLM>
  455. endm
  456. staticD macro n,i,s
  457. ?ad <n>,4
  458. ?dd n,0,<dword>,<dd>,<i>,<s>,<PLM>
  459. endm
  460. staticQ macro n,i,s
  461. ?ad <n>,8
  462. ?dd n,0,<qword>,<dq>,<i>,<s>,<PLM>
  463. endm
  464. staticT macro n,i,s
  465. ?ad <n>,10
  466. ?dd n,0,<tbyte>,<dt>,<i>,<s>,<PLM>
  467. endm
  468. if sizec
  469. staticCP macro n,i,s
  470. staticD n,<i>,<s>
  471. endm
  472. else
  473. staticCP macro n,i,s
  474. staticW n,<i>,<s>
  475. endm
  476. endif
  477. if sized
  478. staticDP macro n,i,s
  479. staticD n,<i>,<s>
  480. endm
  481. else
  482. staticDP macro n,i,s
  483. staticW n,<i>,<s>
  484. endm
  485. endif
  486. endif
  487. ?dd macro n,p,t,d,i,s,c
  488. ?gcc ?dd2,%?PLM,<c>
  489. ife ?dd2
  490. n label t
  491. ?dd1 _&n,p,<d>,<i>,<s>
  492. else
  493. ?dd1 n,p,<d>,<i>,<s>
  494. endif
  495. endm
  496. ?dd1 macro n,p,d,i,s
  497. if p
  498. public n
  499. endif
  500. ifb <s>
  501. n d i
  502. else
  503. ifb <i>
  504. n d s dup (?)
  505. else
  506. n d s dup (i)
  507. endif
  508. endif
  509. endm
  510. ifndef ?NOEXTERN
  511. .xcref
  512. .xcref ?ex1,?ex2,externB,externW,externD,externQ,externT
  513. .xcref externNP,externFP,externP,externCP,exte